package io.github.echarts.app;

import io.github.echarts.model.ChartModel;
import io.github.echarts.model.adapter.OptionModelAdapter;
import io.github.echarts.model.theme.ThemeManager;
import io.github.echarts.option.EChartOption;
import io.github.echarts.render.GraphicsRenderer;
import io.github.echarts.render.svg.SVGRenderer;
import io.github.echarts.coordinator.RenderingCoordinator;

/**
 * ECharts Java 库的主要入口点。
 * 这个类提供了创建和渲染图表的简单API。
 */
public class Chart {
    
    /** 图表配置选项 */
    private EChartOption option;
    
    /** 图表宽度 */
    private int width;
    
    /** 图表高度 */
    private int height;
    
    /** 主题名称 */
    private String themeName;
    
    /**
     * 创建一个新的图表，使用默认尺寸 (800x600)。
     */
    public Chart() {
        this(800, 600);
    }
    
    /**
     * 创建一个具有指定尺寸的新图表。
     * 
     * @param width 图表宽度（像素）
     * @param height 图表高度（像素）
     */
    public Chart(int width, int height) {
        this.width = width;
        this.height = height;
        this.option = new EChartOption();
        this.themeName = "default"; // 默认主题
    }
    
    /**
     * 使用指定的尺寸和选项创建一个新的图表。
     * 
     * @param option 图表配置选项
     * @param width 图表宽度（像素）
     * @param height 图表高度（像素）
     */
    public Chart(EChartOption option, int width, int height) {
        this.option = option;
        this.width = width;
        this.height = height;
        this.themeName = "default"; // 默认主题
    }
    
    /**
     * 获取图表宽度。
     * 
     * @return 宽度（像素）
     */
    public int getWidth() {
        return width;
    }
    
    /**
     * 设置图表宽度。
     * 
     * @param width 宽度（像素）
     * @return 此图表实例，用于方法链式调用
     */
    public Chart setWidth(int width) {
        this.width = width;
        return this;
    }
    
    /**
     * 获取图表高度。
     * 
     * @return 高度（像素）
     */
    public int getHeight() {
        return height;
    }
    
    /**
     * 设置图表高度。
     * 
     * @param height 高度（像素）
     * @return 此图表实例，用于方法链式调用
     */
    public Chart setHeight(int height) {
        this.height = height;
        return this;
    }
    
    /**
     * 获取图表选项。
     * 
     * @return EChartsOption 配置
     */
    public EChartOption getOption() {
        return option;
    }
    
    /**
     * 设置图表选项。
     * 
     * @param option EChartsOption 配置
     * @return 此图表实例，用于方法链式调用
     */
    public Chart setOption(EChartOption option) {
        this.option = option;
        return this;
    }
    
    /**
     * 获取当前使用的主题名称。
     * 
     * @return 主题名称
     */
    public String getTheme() {
        return themeName;
    }
    
    /**
     * 设置要使用的主题。
     * 
     * @param themeName 主题名称 (如 "default", "dark" 等)
     * @return 此图表实例，用于方法链式调用
     * @throws IllegalArgumentException 如果指定的主题不存在
     */
    public Chart setTheme(String themeName) {
        // 检查主题是否存在
        ThemeManager themeManager = ThemeManager.getInstance();
        if (!themeManager.hasTheme(themeName)) {
            throw new IllegalArgumentException("Theme '" + themeName + "' does not exist. Available themes: " + 
                String.join(", ", themeManager.getAvailableThemeNames()));
        }
        
        this.themeName = themeName;
        return this;
    }
    
    /**
     * 获取可用的主题名称列表。
     * 
     * @return 可用主题名称数组
     */
    public String[] getAvailableThemes() {
        return ThemeManager.getInstance().getAvailableThemeNames();
    }
    
    /**
     * 将图表渲染为SVG。
     * 
     * @return 以字符串形式返回的SVG内容
     */
    public String renderToSVG() {
        // 在选项中设置主题
        option.setTheme(themeName);
        
        // 使用适配器将选项转换为模型
        ChartModel model = OptionModelAdapter.adaptFromOption(option, width, height);
        
        // 创建SVG渲染器
        GraphicsRenderer renderer = new SVGRenderer();
        
        // 创建渲染协调器并执行渲染
        RenderingCoordinator coordinator = new RenderingCoordinator(model, renderer);
        return coordinator.coordinate();
    }
} 